home *** CD-ROM | disk | FTP | other *** search
- ; SOUND - Produce a sound for a specified amount of time
- ;
- ; This procedure imitates the BASIC sound statement in
- ; that it allows the caller to create a specified sound
- ; for a specified amount of time.
- ;
- ; Entry:
- ; DI = frequency (21 to 65535) .. in hertz
- ; BX = duration (0 to 65535) .. in hundredths of secs
- ;
- ; Exit:
- ; All registers are preserved
- ;
-
- PUBLIC SOUND
-
- ; EQUATES
-
- TIMER EQU 40H ;8253-5 TIMER
- PPI EQU 61H ;8255A-5 PPI
-
- TENMS EQU 2801 ;CONSTANT FOR 10 MILLISECOND LOOP
-
- ; Executable code starts here
-
- SOUNDSG SEGMENT PARA PUBLIC 'CODE'
-
- SOUND PROC FAR
- ASSUME CS:SOUNDSG
-
- PUSH AX ;AX - SAVE ALL REISTERS..
- PUSH BX ;BX
- PUSH CX ;CX
- PUSH DX ;DX
- PUSH DI ;DI
-
- MOV AL,0B6H ;AL = TIMER MODE VALUE
- OUT TIMER+3,AL ;SET THE TIMER MODE
-
- MOV DX,14H ;SET THE 32-BIT TIMER DIVISOR TO..
- MOV AX,4F38H ;1331000 ...
- DIV DI ;AND DIVIDE BY THE FREQUENCY DESIRED
-
- OUT TIMER+2,AL ;SET TIMER 2'S LOW BYTE
- MOV AL,AH ;AH = HIGH BYTE
- OUT TIMER+2,AL ;SET TIMER 2'S HIGH BYTE
-
- IN AL,PPI ;GET PPI'S PORT B SETTING
- MOV AH,AL ;... SAVE IT IN AH
- OR AL,00000011B ;LAST 2 BITS ON (ENABLE SPK VIA TIMER 2)
- OUT PPI,AL ;TURN ON THE SPEAKER
-
- AA010: MOV CX,TENMS ;CX = COUNTDOWN FOR 1/100 SEC
- AA020: LOOP AA020 ;... WAIT 1/100 OF A SECOND
-
- DEC BX ;Q: TIME UP?
- JNZ AA010 ;A: NO.. CONTINUE LOOPING
-
- MOV AL,AH ;AL = ORIGINAL PPI PORT B SETTING
- OUT PPI,AL ;RESTORE IT.
-
- POP DI ;DI - RESTORE REGISTERS
- POP DX ;DX
- POP CX ;CX
- POP BX ;BX
- POP AX ;AX
- RET far ;RETURN TO CALLER
- SOUND ENDP
- SOUNDSG ENDS
- END SOUND